

#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

void my_printf(const char *format, ...) __attribute__((format(printf, 1, 2)));

/*
 * 模拟标准库函数printf，它接受一个格式化字符串和可变数量的参数，并将格式化后的输出打印到标准输出。
 * 通过使用va_list和相关的宏来处理可变参数，函数能够将格式化字符串和参数传递给vprintf函数进行输出。
 * 需要注意的是，这个函数没有进行格式字符串和参数的类型检查，所以在使用时需要确保格式化字符串与参数的类型和数量相匹配，以避免潜在的运行时错误。
 */
void my_printf(const char *format, ...) {
  // va_list是一个类型，用于存储可变数量的参数。
  va_list args;
  // va_start宏用于初始化args，使其指向可变参数列表的起始位置。第二个参数是最后一个非可变参数，即格式化字符串format。
  va_start(args, format);
  // vprintf是一个标准C函数，用于根据格式化字符串format和可变参数列表args打印输出。它与printf函数类似，但接受一个va_list参数而不是可变数量的参数。
  vprintf(format, args);
  // va_end宏用于结束对可变参数的访问，清理相关资源。
  va_end(args);
}

int main() {
  // Usage of my_printf with correct format string
  my_printf("%d %s\n", 42, "hello");

  // Usage of my_printf with incorrect format string
  // my_printf("%s %d\n", 42, "hello"); // generates warning or error
}